package com.shop.util;

import org.apache.commons.lang3.StringUtils;

import java.util.Random;
import java.util.UUID;

/** 
 * 随机工具类
 * @author Jerry
 * @date 2016年10月25日 上午12:05:32 
 */
public class RandomUtil {
	
	private static final char[] numChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

	private static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

	private static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

	/**
	 * 获取去 - 的 32 位 UUID 字符串
	 * @return    
	 * @author Jerry
	 * @date 2016年10月25日 上午12:06:24
	 */
	public static String randomUUID32() {
		String str = UUID.randomUUID().toString();
		return str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);
	}

	/**
	 * 获取去 - 的 16 位 UUID 字符串
	 * @return
	 * @author Jerry
	 * @date 2016年10月25日 上午12:06:24
	 */
	public static String randomUUID16() {
		String str = UUID.randomUUID().toString();
		return str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18);
	}

	/**
	 * 获取 UUID 字符串 
	 * @return    
	 * @author Jerry
	 * @date 2016年10月25日 上午12:06:24
	 */
	public static String randomUUID36() {
		return UUID.randomUUID().toString();
	}
	
	/**
	 * 获取指定位数的随机数字串
	 * @return    
	 * @author Jerry
	 * @date 2016-12-15 19:29:07
	 */
	public static String randomNumber(int count) {
		StringBuffer sb = new StringBuffer();
		char c;
		for (int i = 0; i < count; i++) {
			c = numChars[new Random().nextInt(numChars.length)];
			if(i == 0 && c-'0' == 0) {	// 首字母为0时改为1
				c = '1';
			}
			sb.append(c);
		}
		return sb.toString();
	}
	
	/**
	 * 获取6位数的随机数字串
	 * @return    
	 * @author Jerry
	 * @date 2016-12-15 19:29:07
	 */
	public static String randomNumber6() {
		return randomNumber(6);
	}

	/**
	 * 获取指定区间的随机数（闭区间） [min, max]
	 * @return
	 * @author Jerry
	 * @date 2019-9-19 20:15:45
	 */
	public static int  randomNumberRangeIn(int min, int max) {
		return new Random().nextInt((max-min)) + min;
	}

    /**
     * 获取数字和字符结合的随机数串
     * @param length
     * @return
     */
    public static String generateMixString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(allChar.charAt(random.nextInt(letterChar.length())));
        }
        return sb.toString();
    }

	/**
	 * 生成订单号
	 * @return
	 */
	public static String generateOrderNo() {
    	return generateOrderNo(null);
	}

	/**
	 * 生成订单号
	 * @param prefix
	 * @return
	 */
	public static String generateOrderNo(String prefix) {
		String orderNo = DateUtil.getTodayShortDatetimeMs() + randomNumber6();
		if(StringUtils.isBlank(prefix)) {
			return orderNo;
		}
		return prefix + orderNo;
	}

	/**
	 * 生成7位长度补0id订单号
	 * @param prefix
	 * @return
	 */
	public static String generateId7OrderNo(String prefix, Long id) {
		return generateIdOrderNo(prefix, id.toString(), 7);
	}

	/**
	 * 生成指定长度补0订单号
	 * @param prefix
	 * @return
	 */
	public static String generateIdOrderNo(String prefix, String id, int num) {
		StringBuffer idStr = new StringBuffer("");
		if(StringUtils.isNotBlank(id)) {
			idStr = idStr.append(id);
			if(id.length() < num) {
				for (int i = 0; i < num - id.length(); i++) {
					idStr = idStr.append("0");
				}
			}
		}

		String orderNo = new StringBuffer(DateUtil.getTodayShortDatetimeYear()).append(idStr).append(randomNumber6()).toString();
		if(StringUtils.isBlank(prefix)) {
			return orderNo;
		}
		return prefix + orderNo;
	}

	public static void main(String[] args) {
		Long id = 12314L;
		System.out.println(generateId7OrderNo("A", id));
	}

}
